vlwkaos' digital garden

Rust - CLI argument

일반적으로 CLI tool은 아래처럼 뭔가 입력받는다.

grrs foobar test.txt

main에 아래 코드를 넣으면 첫번째 두번째 인자 받아옴.

let pattern = std::env::args().nth(1).expect("no pattern given"); 
let path = std::env::args().nth(2).expect("no path given");

이렇게하면 string으로만 받으니까, 각 인자를 type으로 여기는게 낫다.

struct Cli {
    pattern: String,
    path: std::path::PathBuf,
}

PathBuf는 String과 비슷한데 크로스플랫폼 파일시스템 경로용도로 사용됨

option 이름

아래처럼 옵션 이름을 주고 파싱시키려면?

--pattern "foo"
--pattern="foo"
--help

유명한 라이브러리 clap 를 사용한다.

  Cargo.toml 파일 [dependencies] 아래 다음을 넣어서 의존성 추가하기

clap = { version = "3.0", features = ["derive"] }

아래 처럼 trait사용추가. clap에는 다양한 옵션이 있음

#![allow(unused)] // 이건 그냥 경고문구 없애려고 추가함
use clap::Parser;

#[derive(Parser)]
struct Cli {
    pattern: String,
    #[clap(parse(from_os_str))]
    path: std::path::PathBuf,
}

// #[clap(short = 'o', long = "output")] 이런식으로 지정도 가능

그리고 main에 다 지우고 이걸 추가한다.

    let args = Cli::parse();
    // 실패해도 clap이 자동으로 help 메세지도 만들어줌
    // parse 메소드는 main에서만 사용할 것

확인은 cargo run 인자를 넘기려면 cargo run -- some-pattern some-file 이렇게 할 수 있고, 자동 help 메세지를 띄워보면 cargo run -- --help 아래처럼 인자에 대한 정보가 나온다.

grrs

USAGE:
    grrs <PATTERN> <PATH>

ARGS:
    <PATTERN>
    <PATH>

OPTIONS:
    -h, --help    Print help information

[[Rust - CLI implement grep like function]]

Rust - CLI argument